import os
import shutil

from pasers.docx_paser.docx_parse import parse_docx, parse_doc, parse_pdf


def traverse_dir(path, tails, file_info_ls=None):
    """
    :param path:
    :param tails:
    :param file_info_ls:
    :return: [(文件路径1，文件名1),(文件路径2，文件名2),(文件路径3，文件名3),...,(文件路径n，文件名n)]
    注意：如路经太深python就无法检测该文件了，遇到这种情况请开启 clean_path功能；
    参考： https://blog.csdn.net/baidu_34928905/article/details/131935428
    """
    if file_info_ls is None:
        file_info_ls = []
    for file in os.listdir(path):
        file_path = os.path.join(path, file)
        if os.path.isdir(file_path):
            traverse_dir(file_path, tails, file_info_ls)
        else:
            file_e_ls = os.path.basename(file_path).split('.')
            file_tail = file_e_ls[-1]
            if (tails is None or file_tail.lower() in tails) and not os.path.basename(file_path).startswith('~$'):
                item = (file_path, '.'.join(file_e_ls[0:-1]))
                file_info_ls.append(item)
    return file_info_ls


def unzip_files(path_all):
    """
    解压path_all路径下所有的zip文件
    :param path_all: 可能含有zip文件的文件夹
    :return:
    """

    doc_iters = traverse_dir(path_all, ['zip', 'ZIP'])
    if not doc_iters:
        return
    import zipfile
    for path_each, f_name in doc_iters:
        # 遍历所有需要压缩的文件夹
        print("正在解压：%s" % f_name)
        path_decompress = path_each
        unzip_path = path_decompress[:-4]
        zip_file = zipfile.ZipFile(str(path_decompress), 'r')  # 压缩文件位置
        name_list = zip_file.namelist()
        if name_list:
            for idx, file in enumerate(zip_file.namelist()):
                if file.endswith('\\') and os.path.exists(file):
                    shutil.rmtree(file)
                zip_file.extract(file, unzip_path)  # 解压位置,pwd="1234".encode('utf-8')
            zip_file.close()


def parse_file(failed_ls, converted_dir, out_dir, ofd_unzip_path, image_saved_dir):
    """
    1. 将doc、pdf文件转换为docx文件，将xls文件转换为xlsx文件；
    2. 解析docx、ofd和xml文件内容并保存在out_dir路径下。

    参数:
    :param converted_dir: 待解析文件的路径
    :param out_dir: 文件解析后的输出路径
    :param unzip_dir: zip文件解压的临时存储路径
    :param image_saved_dir: 图片文件保存路径
    """
    # 如果指定的图片保存目录不存在，则创建该目录
    os.makedirs(image_saved_dir, exist_ok=True)
    os.makedirs(out_dir, exist_ok=True)
    os.makedirs(ofd_unzip_path, exist_ok=True)
    # 导入处理docx、doc和pdf文件的模块

    # 设置路径变量以便处理各类文件
    docx_files = os.path.join(converted_dir, 'docx_files')
    if os.path.exists(docx_files):
        # 解析docx文件，并将内容和图像保存到指定输出路径
        parse_docx(failed_ls, docx_files, out_dir, image_saved_dir)

    doc_files = os.path.join(converted_dir, 'doc2docx_files')
    if os.path.exists(doc_files):
        # 解析doc文件，转换为docx格式后处理
        parse_doc(failed_ls, doc_files, out_dir, image_saved_dir)

    pdf_files = os.path.join(converted_dir, 'pdf2docx_files')
    if os.path.exists(pdf_files):
        # 解析pdf文件，转换为docx格式后处理
        parse_pdf(failed_ls, pdf_files, out_dir, image_saved_dir)

    # 导入处理xml文件的模块并解析xml文件
    from pasers.xml_paser.xml_parse import parse_xml
    parse_xml(failed_ls, converted_dir, out_dir)

    # 解析ofd文件（如果存在）
    from pasers.ofd_paser.ofd_parse import parse_ofd
    parse_ofd(failed_ls, converted_dir, out_dir, ofd_unzip_path, image_saved_dir)
    unzip_files(ofd_unzip_path)

    # 导入处理图片文件的模块并解析图像文件
    from pasers.img_parser.img_parse import parse_img
    parse_img(failed_ls, converted_dir, out_dir, image_saved_dir)

    from pasers.text_paser.txt_parse import parse_txt
    parse_txt(failed_ls, converted_dir, out_dir)
